有了前两章的学习经验,我们已经了解了最基本文件的操作和文本操作,但这仅仅是最基础的。 由于 Linux 的特性,操作 Linux 时,大部分时间都是完全靠键盘来进行人机交互,因此在进行文件编辑的时候也是很少会使用到鼠标。 Linux 目前大部分发行版都自带了 Vim 编辑器,那么本篇我们就开始大致的学习下号称编辑器之神 Vim 。 由于笔者之前使用 Vim 较少,仅仅会最简单的操作因此,本篇还是以学习为主。

进入 Vim

上面说到,Vim 是现在很多 Linux 发行版的自带编辑器,那么我们先进入编辑器中。

$ vim

就像打开 word 一样,进入了 Vim 编辑器中,上面显示了版本等相关信息。 输入 :e fileName \Enter 便会打开 fileName 文档。(之后会省写 \Enter 操作) 这里我们给出 Vim 的键位图,方便之后的学习: Vim 键位图

我又在网上看到一个各个模式切换的图,感觉很不错也一并贴上来。 Vim 模式切换图

三种模式

Vim 有三种最常用的模式:

Normal-Mode 基本模式。此模式只能输入命令,可剪切复制文本。
Insert-Mode 编辑模式。此模式下跟记事本一样,编辑文本。
Ed-Mode 命令行模式。此模式类似于 word 下的命令栏操作,包括保存,打开,另存为等。

这么看 Vim 的功能其实非常全面,都考虑到了。 那我们就一步步来从头学习 Vim 。

Normal-Mode 基本模式

我们每次打开一个新的文件时,总是处于基本模式,同时基本模式也是切换其他模式的毕竟之路,可以理解成 Vim 的主模式。

游标移动

不同于一边的编辑器,其游标移动是通过 hjkl 四个键进行左下上右的相关移动。 我想其主要目的是为了配合打字更方便一些吧。当然了,也支持方向键操作。同时 Backspace Space + - 也是支持左右下上的操作,看个人习惯了。

除了上面一个一个字符的移动,Vim 还支持更为复杂的移动方式。

0 移至行首
^ 移至逻辑行第一个非空位置 (逻辑行就是书写的自然行,不添加换行符)
g^ 移至屏幕行第一个非空位置 (屏幕行就是在终端可以显示的一行,有可能比标准行短)
$ 移至逻辑行尾  
g$ 移至屏幕行尾  (^ $ 其实就是借鉴了正则的规则)

G (GOTO)移至最后一行
gg 移至第一行
nG 移至第n行  (1G == gg)

w (word) 移至下一个单词的首部
e (word end)移至下一个单词的尾部
b (back)移至上一个单词的首部

W E B 同上,不过他们会将和字母连着的符号算作是一个单词
如:[go] 在w会跳转三次分别是`[` `g` `]`, 如果使用 W 则只会在 `[` 进行跳转。
H M L 移至屏幕顶端,中间,下面的第一个非空字符

:n 同 nG 移动到第n行首字符
Ctrl-b 上一页
Ctrl-f 下一页

(、)移动的上一个句首、下一个句首 以`.?!`结尾被视为句尾
{、} 移动到上一个段首、下一个段首 以空行结尾被视为句尾

% 匹配当前位置前后的 () [] {}

z. 将屏幕移到以游标为中心的位置
zt 将屏幕移到以游标为顶的位置
zb 将屏幕移到以游标为底的位置

删除操作

Vim 在基本模式中,会使用 x d 两种方式,x 通常是以字符为单位进行删除的,d 是以单词或者行为单位进行删除操作:

x 删除当前光标所在的字符,后面补齐
X 删除当前光标之前的字符 (x 操作是单独的,不能跟随任何附加操作)
d{motion} 删除光标移动所到之处的字符
  :dw 删除当前位置到下一个单词前所有内容
  :de 删除当前位置到下一个单词后所有内容
  :dnG 删除当前行到第n行所有内容
  :d^ 删除当前位置到自然行首
  :dg$ 删除当前位置到屏幕行尾
dd 删除当前行
D 同d$ 删除当前位置到自然行尾

替换操作

同删除 Vim 同样使用 r c s 三种方式来进行替换操作。r 用以替换单个字符,s 删除当前位置字符并在后面进行插入操作,c 相对于更灵活一些,可以针对单词、整行进行替换,其实也是先删除后插入。

r 替换当前光标上的字符,注意仅仅是一个字符,无法跟随别的操作
s 删除当前光标上的字符,后面进入 insert 模式
c{motion} 删除光标移动所到之处的字符,同时进入 insert 模式

R 会一直进行替换操作,按下ESC后会停止
~ 会将字符大小写进行转换,同 r 的使用方法
cc 删除当前行并进入 insert 模式
S 同 ss 删除当前行并进入 insert 模式
C 同 c$ 删除当前位置到自然行尾

复制粘贴操作

Vim 的复制操作用 y 来执行,类似 d ,y 同样有三种写法:

y{motion} 复制当前位置到光标移动到的位置
  :y^ 复制当前位置到行首
  :y$ 复制当前位置到行尾
  :y2e 复制从当前位置到两个单词之前
  :y6G 复制当前行和第6行之间所有行
yy 复制当前行
Y 复制当前行 同 yy

粘贴操作则是更为简单 p 复制到光标之后的位置 P 则是复制到光标之前。注意如果要粘贴的内容为一整行内容,则是复制到光标所在行的之前或者之后的位置。

当然 Vim 的复制操作更强悍的一点在于其有多个寄存器,你可以复制到不同的寄存器,也可以从寄存器获取内容。

:reg #来查看当前的寄存器都有哪些内容

通常我们在复制粘贴的时候可以指定寄存器,只需要在 y、p 命令之前加上 "[a-z] 这样便可以指定 a 到 z 不同的缓存区进行粘贴或者复制操作。

\"xy3w #将当前光标后的3个单词复制到x寄存器
:reg
\"x   ses [dep  #寄存器的内容

这样在粘贴的时候就可以使用 x 缓存的内容来进行粘贴操作了。注意如果要使用某个寄存器,必须明示,否者会默认使用 " 寄存器的内容。除了a-z的26个缓存区,还有几个特定的寄存器需要知道:

0-9 寄存器。用来寄存删除和复制的内容,其中 0 是拷贝寄存器,保存拷贝来的字符串,1-9 保存了删除掉的字符串。其中删除寄存器只会保存整行的删除,删除内容以此类推。
- 寄存器。上面说了删除寄存器只会保存整行的内容,那么非整行的内容只会保存的 - 寄存器中。注意:d$ 删除逻辑行,这个操作也会保存到这里,因为他不是真正意义上的整行
. 寄存器。保存了上次 insert 内容
% 寄存器。保存当前文件名,而是从当前Vim的工作目录到该文件的路径。
:寄存器。保存了上一次命令模式下输入的内容。 注意:前面这3个属于只读寄存器,不可写。
/ 寄存器。保存上一次搜索的关键词。

好了,最基本的编辑操作就是这些:复制(y)、粘贴(p)、删除(d)、替换(c),基本用法都是三种:x{motion}xxX 总体来说还是很好记忆的。

查找替换

作为编辑器肯定是支持查找功能的(Find),在 Vim 开启查找功能其实很简单输入 / 即可输入想要查找的字符串。

/arirus  # 在光标当前位置之后查找 arirus

? 也是查找不过是当前位置之前查找匹配的字符串。nN分别是查找下一个、上一个匹配的字符串。

Vim 查找是支持正则的,这个我们之前说过,但是由于对于 PCRE 的不完全兼容,他是不支持 \b 来进行边界匹配的。同时也不是完全的 BRE 兼容他将 < > 视作特殊字符,就是说在 magic 模式下,如果不加反斜杠是无法正常解析为边界匹配。所以当我们使用 very magic(ERE)模式的时候,注意不要加反斜杠来表示边界匹配。

/\<[0-9]\{3\}\>  # magic 模式 匹配一个3个字符长度的数字
/\v<[0-9]{4}> # very magic 模式 匹配4个字符长度的数字

除了上面的模式匹配 Vim 还支持游标处单词匹配。* 便会搜索游标处的单词,我们可以看到其实他是转成了匹配 /\<{WORD}\>#效果一样的,不过是向上匹配。

替换功能(Substitute) 和之前的 r 代表的 Replace 功能不同,那个主要针对光标处的字符进行操作,而 Substitute 则强调的是整体替换,十分类似 sed 的 s 功能。

:[range]s[ubstitute]/{pattern}/{string}/[c][e][g][p][r][i][I] [count]
:s/root/ROOT/g 6 # 从此行开始将每一行的 root 替换为 ROOT 重复6行
# 这里g 表示 global 全部替换; e 表示忽略报错提示; i 表示忽略大小写等等。

其他

除了上述常规操作,还有一些指令是比较常用的:

. 重复执行上一次的操作。
u 回退上一次的操作。
Ctrl-r redo 操作和 u 相反
Ctrl-b 上一页 pageUp
Ctrl-f 下一页 pageDown
Ctrl-e 向下滑动
Ctrl-y 向上滑动

Insert-Mode 插入模式

在此模式下,Vim 如同一个记事本,可以对文本进行直接的编辑。在 Insert 模式下,左下角会显示 INSERT, 这个也是 Vim 最没用特色的模式吧(个人觉得)。 进入此模式有如下的方法:

i (insert) 在光标之前开始进行插入编辑
a (append) 在光标之后开始进行插入编辑
o (open) 在光标所在行的下一行新插入一行开始编辑
I 在光标所在行之前开始进行插入编辑
A 在光标所在行之后开始进行插入编辑
O 在光标所在行的下一行新插入一行开始编辑

除了这些方法,还可以使用上面说的 sS方法进入插入模式。从插入模式推出按下 ESC 即可。

Ed-Mode 命令模式

我们上面其实已经有过接触了对于命令模式,查看寄存器的时候就是使用的命令模式来进行查看的。 这里我们我们再说说命令模式别的用处。

多档编辑

Vim 支持多档编辑,可以同时打开多个文件。不需要特殊操作,可以在进入 Vim 后跟多个文档就可以。或者在命令行模式中调用 :e 打开新的文档即可。

$ vim file1 file2 file3 #同时打开3个文档

可以在命令行模式中输入 ls 来查看当前有多少文档在编辑:

:ls
  1 %a   "file1"                    line 1
  2      "file2"                    line 0
  3      "file3"                    line 0

切换各个文档也很简单使用 :bN N 表示要切换文档的编号,或者 :bl:bn 切换到前后的文档。 这个指令用处获取不多,这里就不细讲了。

退出

第一次使用 Vim 的同学肯定被他的退出搞崩溃了,太不友好了。而且不还有个段子:如何生成一条随机字符串?让一个新手 Vimer 进行退出操作。虽然比较夸张,但却是不够友好。 Vim 的退出需要在命令行模式下进行如下操作:

:q # 未对文件进行任何的修改,可以直接离开,但如果有修改那么会报错
:q! # 放弃当前所有的修改离开
:wq # 保存修改并且退出 其实是 w q 两个命令的联合使用
:w {fileName} #将文件另存为到另一个文件  
# 对于同时编辑多个文件,在退出指令后加一个 a 便可以针对所有文件生效

多窗口

上面说过 Vim 支持多档编辑,那么如果只有一个窗口,来回切换文档会很蛋疼,Vim 也是支持多窗口来进行编辑文件的。

Ctrl+w s  # W(Window) s(split) 上下分隔当前文本到一个新的窗口
Ctrl+w v  # v(vertical ?) 水平分隔当前文本到一个新的窗口
# 在命令行模式下也可以进行切分操作
:sp {fileName} 上下分隔fileName到一个新的窗口,如果 fileName 未填写则默认未当前版本
:vsp {fileName} 左右分隔fileName到一个新的窗口,如果 fileName 未填写则默认未当前版本
Ctrl+w w #循环切换当前的工作窗口
Ctrl+w h,j,k,l # 光标切换与这些窗口之间
Ctrl+w H,J,K,L # 当前窗口在上下左右来回切换
Ctrl+w c  # c(close) #关闭当前的窗口

小结

除了上面结束的三种模式还有 Visual Select 等模式,比较简单这里不做介绍了。 掌握了上面说的,我觉得进行文件编辑应该是不成问题的。但是这仅仅是开始,Vim 还有包管理等,这次我们就不涉及了,看看之后有没有机会写一下这里的相关东西。

results matching ""

    No results matching ""